package com.seeyon.apps.ndk.kit;

import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.SystemEnvironment;
import com.seeyon.ctp.common.log.CtpLogFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


public class FtpKit {
    private static final Log log = CtpLogFactory.getLog(FtpKit.class);

    private static final String user = AppContext.getSystemProperty("ndk.ftp.user");
    private static final String password = AppContext.getSystemProperty("ndk.ftp.password");
    private static final String port = AppContext.getSystemProperty("ndk.ftp.port");
    private static final String host = AppContext.getSystemProperty("ndk.ftp.host");
    private static final String path = AppContext.getSystemProperty("ndk.ftp.path");


    /**
     * 通过FTP协议将文件上传到FTP服务器
     *
     * @param file 要上传的文件
     * @return 是否成功上传
     * @throws Exception
     */
    public static boolean uploadFile(File file) throws Exception {

        FTPClient ftpClient = getFtpClient();  // 获取FTP客户端实例

        FileInputStream fileInputStream = new FileInputStream(file);  // 创建文件输入流

        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);  // 设置文件类型为二进制

        ftpClient.changeWorkingDirectory(path);  // 更改工作目录

        boolean isUpload = ftpClient.storeFile(file.getName(), fileInputStream);  // 将文件上传到FTP服务器

        if (!isUpload) {
            log.info("通过ftp模式上传文件到FTP服务器失败:" + ftpClient.getReplyString());  // 如果上传失败，则记录失败信息
        }

        fileInputStream.close();  // 关闭文件输入流

        ftpClient.logout();  // 注销FTP客户端

        return isUpload;  // 返回上传结果

    }

    /**
     * 从FTP服务器下载文件
     *
     * @param fileName 需要下载的文件名
     * @param downLoadPath 需要下载的文件路径
     * @return 下载成功的文件对象
     * @throws Exception 下载过程中可能出现的异常
     */
    public static File downLoadFile(String fileName, String downLoadPath) throws Exception {
        File file = null;  // 定义一个空的文件对象
        FTPClient ftpClient = getFtpClient();  // 获取FTP客户端对象
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        String downLoadPath_new = downLoadPath.replace(fileName,"");
        log.info("附件原路径:" + downLoadPath_new);
        ftpClient.changeWorkingDirectory(downLoadPath_new);
        String systemUrl = SystemEnvironment.getBaseFolder().replaceAll("\\\\", "/");  // 获取基础文件夹路径
        String pathUrl = systemUrl + "/upload/customFile/";  // 拼接出上传文件的路径
        File filePath = new File(pathUrl);  // 创建文件路径对象
        if (!filePath.exists()) {  // 如果文件路径不存在
            createFolder(pathUrl);  // 创建文件夹
        }
        String pathUrl_new = pathUrl + fileName;  // 拼接出下载文件的路径
        log.info("附件临时存放路径:" + pathUrl_new);
        FileOutputStream fileOutputStream = new FileOutputStream(pathUrl_new);  // 创建文件输出流对象
        boolean isDownLoad = ftpClient.retrieveFile(fileName, fileOutputStream);  // 通过FTP客户端下载文件
        if (!isDownLoad) {  // 如果下载失败
            log.info("通过ftp模式下载FTP服务器上的文件失败:" + ftpClient.getReplyString());  // 输出错误日志
            return file;  // 返回空文件对象
        } else {  // 如果下载成功
            file = new File(pathUrl_new);  // 创建下载文件对象
            return file;  // 返回下载文件对象
        }

    }


    /**
     * 获取FTPClient对象
     *
     * @return FTPClient对象
     * @throws Exception 异常
     */
    private static FTPClient getFtpClient() throws Exception {
        // 创建FTPClient对象
        FTPClient ftpClient = new FTPClient();
        // 设置控制编码为GB2312
        ftpClient.setControlEncoding("GB2312");
        // 连接到FTP服务器
        ftpClient.connect(host, Integer.parseInt(port));
        // 登录FTP服务器
        ftpClient.login(user, password);
        // 输出日志信息，表示ftp服务连接成功
        log.info("ftp服务连接成功!");
        // 进入本地被动模式
        ftpClient.enterLocalPassiveMode();
        // 返回FTPClient对象
        return ftpClient;
    }

    private static File createFolder(String path) {
        File ret = null;
        File file = new File(path);
        if (!file.exists()) {
            if (file.mkdirs()) {
                ret = file;
            }
        } else {
            ret = file;
        }
        return ret;
    }

    public static void main(String[] args) throws Exception {
        String host = "192.168.126.60";
        String port = "21";
        String user = "OA_FTP";
        String password = "Xzndkyy600211!";
        String path = "/OA/";
        // 创建FTPClient对象
        FTPClient ftpClient = new FTPClient();
        // 设置控制编码为GB2312
        ftpClient.setControlEncoding("GB2312");
        // 连接到FTP服务器
        ftpClient.connect(host, Integer.parseInt(port));
        // 登录FTP服务器
        ftpClient.login(user, password);
        // 输出日志信息，表示ftp服务连接成功
        // 进入本地被动模式
        ftpClient.enterLocalPassiveMode();

        String ss = "D:\\system\\Desktop\\人工麝香合同.jpg";
        File folder = createFolder(ss);

        FileInputStream fileInputStream = new FileInputStream(folder);  // 创建文件输入流

        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);  // 设置文件类型为二进制

        ftpClient.changeWorkingDirectory(path+folder.getName());  // 更改工作目录

        boolean isUpload = ftpClient.storeFile(folder.getName(), fileInputStream);  // 将文件上传到FTP服务器

        if (!isUpload) {
            log.info("通过ftp模式上传文件到FTP服务器失败:" + ftpClient.getReplyString());  // 如果上传失败，则记录失败信息
        }

        fileInputStream.close();  // 关闭文件输入流

        ftpClient.logout();  // 注销FTP客户端

        if(isUpload){
            System.out.printf("上传成功");
        }else{
            System.out.printf("上传失败");
        }
    }

}
